package com.study.netty;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;

/**
 * @author mjy
 * @date 2021/12/06
 * @description
 */
public class ServerChannelInitializer extends ChannelInitializer<Channel> {
    @Override
    protected void initChannel(Channel channel) throws Exception {
        //遇到了"#"就表示读到了最后
        ByteBuf buf = Unpooled.copiedBuffer("#".getBytes());
        //这里的8192标识单条消息的最大长度，如果长度达到后任然没有读到，抛
        //出TooLongFrameException,防止由于异常代码流失导致内存溢出
        channel.pipeline().addLast(new DelimiterBasedFrameDecoder(819200,buf));
        //当管道数据进来的时候解码
        channel.pipeline().addLast("decode",new StringDecoder());
        channel.pipeline().addLast("encode",new MessageDecoder());
        //经过编码解码处理后，收到的bytebuf已经变成自己的bean了
        //这个header的先后是有顺序讲究的，除非把静态资源释放，后面的handler
        //才能拿到
        channel.pipeline().addLast(new ServerIdleHandler());//如果多少秒没有接受到数据，就关闭管道
        channel.pipeline().addLast(new ServerHandler());//管道建立之后的读取操作
    }
}
